package br.com.future.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;

import org.apache.log4j.Logger;

import br.com.future.dao.interfaces.AdvogadoProcessoDAOI;
import br.com.future.jdbc.ConnectionFactory;
import br.com.future.log4j.Log4j;
import br.com.future.model.Advogado;
import br.com.future.model.AdvogadoProcesso;
import br.com.future.model.Processo;

public class AdvogadoProcessoDAO implements AdvogadoProcessoDAOI {

	//chamando o metodo da classe Log4j.
	static Logger logger = Logger.getLogger(Log4j.class);
	
	private Connection conn = null;
	private boolean flag = true;
	
	public AdvogadoProcessoDAO(Connection conn){
		this.conn  = conn;
	}
	
	public AdvogadoProcessoDAO(){
		
	}
		/**
		 * Consultar AdvogadoProcesso por numero do Processo.
		 * 
		 * @param nrProcesso
		 * @return AdvogadoProcesso
		 * 
		 */
		@Override
		public AdvogadoProcesso consultar(long nrProcesso){
			verificarInstanciaDeConnection();

			String sql = "SELECT CD_PESSOA_ADV, NR_PROCESSO, DT_INICIO_PARTICIPACAO FROM AM_ADVOGADO_PROCESSO WHERE NR_PROCESSO = ?";
			PreparedStatement ps = null;
			ResultSet rs = null;
			AdvogadoProcesso advogadoProcesso = new AdvogadoProcesso();

			try {
				ps = conn.prepareStatement(sql);
				ps.setLong(1, nrProcesso);
				rs = ps.executeQuery();

				if (rs.next()) {
					Advogado advogado = new AdvogadoDAO(conn).consultarPorCodigo(rs.getInt("CD_PESSOA_ADV"));
					advogadoProcesso.setAdvogado(advogado);
					Processo processo = new ProcessoDAO(conn).consultar(rs.getLong("NR_PROCESSO"));
					advogadoProcesso.setProcesso(processo);
					
					//CONVERTENDO DE DATE PARA CALENDAR
					Calendar dataInicioParticipacao = Calendar.getInstance();
					dataInicioParticipacao.setTime(rs.getDate("DT_INICIO_PARTICIPACAO"));
					advogadoProcesso.setDataInicioParticipacao(dataInicioParticipacao);
				}

			} catch (SQLException e) {
				e.printStackTrace();
				//chamando a mensagem.
				logger.error(e.getMessage());
			} finally {
				if(flag){
					ConnectionFactory.closeConnectionOracle(conn, rs, ps);
				}
			}

			return advogadoProcesso;
		}
		
		@Override
		public AdvogadoProcesso consultar(int codAdvogado){
			verificarInstanciaDeConnection();

			String sql = "SELECT CD_PESSOA_ADV, NR_PROCESSO, DT_INICIO_PARTICIPACAO FROM AM_ADVOGADO_PROCESSO WHERE CD_PESSOA_ADV = ?";
			PreparedStatement ps = null;
			ResultSet rs = null;
			AdvogadoProcesso advogadoProcesso = new AdvogadoProcesso();

			try {
				ps = conn.prepareStatement(sql);
				ps.setLong(1, codAdvogado);
				rs = ps.executeQuery();

				if (rs.next()) {
					Advogado advogado = new AdvogadoDAO(conn).consultarPorCodigo(rs.getInt("CD_PESSOA_ADV"));
					advogadoProcesso.setAdvogado(advogado);
					Processo processo = new ProcessoDAO(conn).consultar(rs.getLong("NR_PROCESSO"));
					advogadoProcesso.setProcesso(processo);
					
					//CONVERTENDO DE DATE PARA CALENDAR
					Calendar dataInicioParticipacao = Calendar.getInstance();
					dataInicioParticipacao.setTime(rs.getDate("DT_INICIO_PARTICIPACAO"));
					advogadoProcesso.setDataInicioParticipacao(dataInicioParticipacao);
				}

			} catch (SQLException e) {
				e.printStackTrace();
				//chamando a mensagem.
				logger.error(e.getMessage());
			} finally {
				if(flag){
					ConnectionFactory.closeConnectionOracle(conn, rs, ps);
				}
			}

			return advogadoProcesso;
		}
		
		private void verificarInstanciaDeConnection() {
			flag = true;
			
			if(conn == null){
				conn = ConnectionFactory.getConnection();
			}else{
				flag = false;
			}
		}
}
